/************************************************
 * 												*
 * Project	:	Family Entertainment 			*
 * Source	:	DAO Class Service 				*
 * Owner	:	Vially Flores					*
 * 												*
 ************************************************/

package upcweb.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import upcweb.modelo.ClsServicio;
import upcweb.modelo.ClsTipoServicio;
import upcweb.util.ConexionBD;
import upcweb.exception.DAOExcepcion;

public class ServicioDAO extends BaseDAO {

	SQLProcDAO sqlDAO = new SQLProcDAO();

	public int generarIdServicio() throws DAOExcepcion{
		String query = " select max(co_servicio)+1 from servicio ";
		query += " ";
		int id=0;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				id=(rs.getInt(1));	
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return id;		
	}
	
	public ClsServicio insertar(ClsServicio oServicio) throws DAOExcepcion {
		/*
		 * select co_servicio, -- int no_servicio, -- varchar no_Descripcion, --
		 * varchar mt_costo_por_persona, -- decimal qt_minima_personas, -- int
		 * no_imagen, -- varchar co_tipo_servicio, -- int fl_Activo -- char from
		 * servicio
		 */
		String query = "insert into servicio values(?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,this.generarIdServicio() );
			stmt.setString(2, oServicio.getName());
			stmt.setString(3, oServicio.getDescription());
			stmt.setDouble(4, oServicio.getCostPerPerson());
			stmt.setInt(5, oServicio.getMinParticipants());
			stmt.setString(6, oServicio.getImageURL());
			stmt.setInt(7, oServicio.getIdTypeService());
			stmt.setBoolean(8, oServicio.isState());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			// vo.setIdCategoria(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		// return vo;
		return null;
	}

	public ArrayList<ClsServicio> listar() throws DAOExcepcion {
		String query = " select co_servicio, no_servicio, no_Descripcion, mt_costo_por_persona, qt_minima_personas, no_imagen,co_tipo_servicio, fl_Activo ";
		query += " from servicio";
		query += " where fl_Activo=1  "; // Esto es para filtrar los eliminados
											// se puede comentar

		ArrayList<ClsServicio> lstServicio = new ArrayList<ClsServicio>();

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {

				ClsServicio s = new ClsServicio();
				s.setIdService(rs.getInt(1));
				s.setName(rs.getString(2));
				s.setDescription(rs.getString(3));
				s.setCostPerPerson(rs.getDouble(4));
				s.setMinParticipants(rs.getInt(5));
				s.setImageURL(rs.getString(6));
				s.setIdTypeService(rs.getInt(7));
				s.setState(rs.getBoolean(8));

				lstServicio.add(s);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lstServicio;
	}

	public boolean actualizar(ClsServicio oServicio) throws DAOExcepcion {
		String query = " update servicio ";
		query += "set no_servicio=?,no_Descripcion=?,mt_costo_por_persona=?,qt_minima_personas=?, ";
		query += "no_imagen=?,co_tipo_servicio=?,fl_Activo=? ";
		query += "WHERE co_servicio=? ";

		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);

			stmt.setString(1, oServicio.getName());
			stmt.setString(2, oServicio.getDescription());
			stmt.setDouble(3, oServicio.getCostPerPerson());
			stmt.setInt(4, oServicio.getMinParticipants());
			stmt.setString(5, oServicio.getImageURL());
			stmt.setInt(6, oServicio.getIdTypeService());
			stmt.setBoolean(7, oServicio.isState());
			stmt.setInt(8, oServicio.getIdService());

			int i = stmt.executeUpdate();
			/*
			 * if (i != 1) { throw new SQLException("No se pudo actualizar"); }
			 */
			return true;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}

	}

	public ClsServicio buscar(int idServicio) throws DAOExcepcion {
		String query = " select co_servicio, no_servicio, no_Descripcion, mt_costo_por_persona, qt_minima_personas, no_imagen,co_tipo_servicio, fl_Activo ";
		query += " from servicio where co_servicio=?";
		//query += " and fl_Activo=1  "; // Esto es para filtrar los eliminados se
										// puede comentar
		query += "  ";

		ArrayList<ClsServicio> lstServicio = new ArrayList<ClsServicio>();

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ClsServicio s = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idServicio);
			rs = stmt.executeQuery();
			if (rs.next()) {

				s = new ClsServicio();
				s.setIdService(rs.getInt(1));
				s.setName(rs.getString(2));
				s.setDescription(rs.getString(3));
				s.setCostPerPerson(rs.getDouble(4));
				s.setMinParticipants(rs.getInt(5));
				s.setImageURL(rs.getString(6));
				s.setIdTypeService(rs.getInt(7));
				s.setState(rs.getBoolean(8));
				System.out.println("Dato Encontrado");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return s;
	}

	public ArrayList<ClsServicio> listarPorTipo(ClsTipoServicio tipo) {
		// TODO Auto-generated method stub
		ArrayList<ClsServicio> lstServicio = new ArrayList<ClsServicio>();
		try {
			ResultSet rs = sqlDAO.getData("{call sp_get_servicios_by_tipo(?)}",
					new Object[] { tipo.getIdTypeService() });
			while (rs.next()) {
				ClsServicio s = new ClsServicio();
				s.setIdService(rs.getInt("co_servicio"));
				s.setName(rs.getString("no_servicio"));
				s.setDescription(rs.getString("no_descripcion"));
				s.setCostPerPerson(rs.getInt("mt_costo_por_persona"));
				s.setMinParticipants(rs.getInt("qt_minima_personas"));
				s.setImageURL("no_imagen");
				s.setIdTypeService(rs.getInt("co_tipo_servicio"));
				// s.setState(rs.getBoolean(8));
				lstServicio.add(s);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return lstServicio;
	}

	/***** 02/12/2012 *****/
	public ArrayList<ClsServicio> listarFiltros(String filtros[])
			throws DAOExcepcion {
		String estado = "";
		String query = " select co_servicio, no_servicio, no_Descripcion, mt_costo_por_persona, qt_minima_personas, no_imagen,co_tipo_servicio, fl_Activo ";
		query += " from servicio";
		query += " where 1=1 ";

		ArrayList<ClsServicio> lstServicio = new ArrayList<ClsServicio>();

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();

			if (filtros.length > 0) {
				/* Filtros ---> [0]=Nombre , [1] Estado * */
				query += " and no_servicio like ? ";
				if (filtros[1].equals("2")) {
					estado = "0,1";
				} else {
					estado = filtros[1];
				}
				query += " and fl_Activo in ( " + estado + " )";
				stmt = con.prepareStatement(query);
				stmt.setString(1, ("%" +  filtros[0] + "%"));
			} else {
				stmt = con.prepareStatement(query);
			}

			rs = stmt.executeQuery();
			while (rs.next()) {

				ClsServicio s = new ClsServicio();
				s.setIdService(rs.getInt(1));
				s.setName(rs.getString(2));
				s.setDescription(rs.getString(3));
				s.setCostPerPerson(rs.getDouble(4));
				s.setMinParticipants(rs.getInt(5));
				s.setImageURL(rs.getString(6));
				s.setIdTypeService(rs.getInt(7));
				s.setState(rs.getBoolean(8));

				lstServicio.add(s);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lstServicio;
	}

}
